<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS函数</title>
</head>
<body>
<script>
    //1.JS通过function关键字来定义函数
    function f1(){
        console.log('f1');
    }
    f1();
    //2.函数的参数
    function f2(n){
        console.log('今天星期六'+n);
    }
    f2('中午吃什么?');
    f2(666);
    f2(false);

    //3.形参与实参的个数问题
    function f3(x,y){
        console.log(x+y);
    }
    f3(3,10);//13
    f3(3);//3+undefined=NaN 未被赋值的形参值为undefiend
    f3(3,10,20);//13 多余的实参会被忽略掉

    //4.arguments用来保存调用函数时传入的实参,可以看到实参的个数与值
    function f4(){
        console.log(arguments);
    }
    f4(50);//Arguments [50,...]
    f4(50,60);//Arguments(2) [50, 60,...]
    f4(50,60,70);//Arguments(3) [50, 60, 70,...]

    //5.函数的返回值
    function f5(a,b){
        //使用return关键字返回方法调用的结果
        return a+b;
    }
    var result = f5(1,6);
    console.log(result);//7 将return的结果保存在result中,再打印出来
    console.log(f5(1,1));//2 直接打印return的结果

    //第二种声明方式:将函数整体交给f6保存,调用时使用变量名调用即可
    var f6 = function(){
        console.log('第二种');
    }
    console.log(f6);//ƒ (){console.log('第二种');}
    console.log(typeof f6);//function
    f6();//调用时直接使用变量的名字调用

    //第三种:箭头函数
    const f7 = (n)=>{
        console.log('第三种'+n);
    }
    f7(123);

    //第四种
    //new Function(参数1,参数2,...,方法体)
    //最后一个参数是字符串类型的方法体
    let f8 = new Function('name','age',"console.log('方法体'+name);return age;");
    console.log(f8('小明',18));
</script>
</body>
</html>